#ifndef ZLBASE_PROTOCOL_ITEMPERATURECONTROLPROTOCOL_H_
#define ZLBASE_PROTOCOL_ITEMPERATURECONTROLPROTOCOL_H_

#include "zlbase/protocol/DeviceDefines.h"
#include "zlbase/protocol/IProtocol.h"

namespace zl
{
namespace zlbase
{
class ZLBASE_API ITemperatureControlBoardProtocol : public IProtocol
{
public:
    ITemperatureControlBoardProtocol();
    virtual ~ITemperatureControlBoardProtocol();

    /// \brief 获取门磁状态
    ///
    /// 获取指定的开门板的门磁状态数据，其中每个字节表示一个格口的门磁状态
    /// (0x00：门关，0x01：门开）,状态值按（1-12）顺序排列
    /// \param[in] col 指定开门板的板号
    /// \param[out] status 二进制状态数据
    /// \param[out] len 状态数据长度
    /// \return 错误码
    virtual int32_t GetDoorStatus(int32_t col, unsigned char *status, size_t &len);

    /// \brief 获取一个门磁状态
    ///
    /// 获取某一个箱门的格口门磁状态数据
    /// (0x00：门关，0x01：门开）
    /// \param[in] col 指定开门板的板号
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status 二进制状态数据
    /// \param[out] len 状态数据长度
    /// \return 错误码
    virtual int32_t GetDoorStatus(int32_t col, int32_t boxnum, unsigned char &status);

    /// \brief 获取物品状态
    ///
    /// 获取指定的开门板的物品状态数据，其中每个字节表示一个可口的物品状态, （0x00：无物，0x01：有物）
    /// 状态值按（1-24）顺序排列
    /// \param[in] col 指定开门板的板号
    /// \param[out] status 状态数据
    /// \param[out] len 状态数据长度
    /// \return 错误码
    virtual int32_t GetItemStatus(int32_t col, unsigned char *status, size_t &len);

    /// \brief 获取指定格口物品状态
    ///
    /// 获取指定的开门板某一个箱子的物品状态, 每一个字节表示一个格口的状态 (0x00：无物，0x01：有物)
    /// \param[in] col 指定开门板的板号
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status 二进制状态数据
    /// \return 错误码
    virtual int32_t GetItemStatus(int32_t col, int32_t boxnum, unsigned char &status);

    /// \brief 打开箱门
    ///
    /// 打开指定箱门，并获该格口的门磁状态 (0x00：门关， 0x01： 门开)
    /// \param[in] col 指定开门板的板号
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status  00：箱子打开成功标志
    /// \param[out] 状态数据长度
    /// \return 错误码
    virtual int32_t OpenLocker(int32_t col, int32_t boxnum, unsigned char &status);

    /// \brief 查询所有12个箱格的温度
    ///
    /// 获取指定的开门板的所有12个箱格的温度，获取的温度 = 实际温度 * 10
    /// \param[out] temperature 温度数据数组
    /// \param[out] len 获取到的温度数据的个数
    /// \return 错误码
    virtual int32_t GetAllBoxTemperatures(int32_t col, int32_t *temperature, size_t &len);

    /// \brief 查询左右两列最底下箱格蒸发器温度
    ///
    /// 获取指定的查询左右两列最底下箱格蒸发器温度，获取的温度 = 实际温度 * 10
    /// \param[out] 左列最下箱蒸发器温度数据
    /// \param[out] 右列最下箱蒸发器温度数据
    /// \return 错误码
    virtual int32_t GetEvaporatorTemperature(int32_t col, int32_t &left, int32_t &right);

    /// \brief 设置左右两列箱格的工作温区
    ///
    /// 设置左右两列箱格的工作温区指令，参数说明：
    /// 查询的方向（0x00：表示查询左列，0x01：表示查询右列）
    /// 工作温区（0x00：表示该箱工作在常温区，0x01：表示该箱工作在冷藏区，0x02：表示该箱工作在冷冻区）
    /// \param[in] col 指定列号
    /// \param[in] direction 指定左列还是右列，对于共风道温控板该参数无效
    /// \param[out] workarea 工作温区
    /// \return 错误码
    virtual int32_t SetWorkAreaOption(int32_t col, unsigned char direction, unsigned char workarea);

    /// \brief 查询左右两列箱格工作温区指令
    ///
    /// 查询左右两列箱格工作温区指令，参数说明：
    /// 查询的方向（0x00：表示查询左列，0x01：表示查询右列）
    /// 工作温区（0x00：表示该箱工作在常温区，0x01：表示该箱工作在冷藏区，0x02：表示该箱工作在冷冻区）
    /// \param[in] col 指定列号
    /// \param[in] direction 指定左列还是右列，对于共风道温控板该参数无效
    /// \param[out] workarea 工作温区
    /// \return 错误码
    virtual int32_t GetWorkAreaOption(int32_t col, unsigned char direction, unsigned char &workarea);

    /// \brief 查询硬件设备的状态指令
    ///
    /// 查询硬件设备的状态指令
    /// \param[in] col 指定列号
    /// \param[out] status 状态数据
    /// \return 错误码
    virtual int32_t GetDeviceStatus(int32_t col, TcbDeviceStatus &status);

    /// \brief 设置箱子总数指令
    ///
    /// 设置箱子总数指令
    /// \param[in] col 指定列号
    /// \param[in] amount 箱子总数，范围为：1-12的所有偶数
    /// \return 错误码
    virtual int32_t SetBoxAmount(int32_t col, unsigned char amount);

    /// \brief 查询箱子总数指令
    ///
    /// 查询箱子总数指令
    /// \param[in] col 指定列号
    /// \param[out] amount 箱子总数，范围为：1-12的所有偶数
    /// \return 错误码
    virtual int32_t GetBoxAmount(int32_t col, unsigned char &amount);

    /// \brief 控制左列或右列开启/停止除霜指令
    ///
    /// 控制左列或右列开启/停止除霜指令
    /// \param[in] col 指定列号
    /// \param[in] direction 指定左列还是右列（0x00：左列， 0x01：右列）
    /// \param[in] data      控制除霜的标志字节（0x00：停止除霜，0x01：开始除霜）
    /// \return 错误码
    virtual int32_t EnableDefrost(int32_t col, unsigned char direction, unsigned char data);

    /// \brief 设置左右两列的除霜间隔时间和除霜时间指令
    ///
    /// 设置左右两列的除霜间隔时间和除霜时间指令
    /// \param[in] col 指定列号
    /// \param[in] direction 指定左列还是右列（0x00：左列， 0x01：右列）
    /// \param[in] interval 表示除霜间隔，实际的除霜间隔时间为（interval * 30）分钟
    /// \param[in] duration 表示除霜时间，实际的除霜时间为duration分钟
    /// \return 错误码
    virtual int32_t SetDefrostOption(int32_t col, unsigned char direction, unsigned char interval, unsigned char duration);

    /// \brief 查询左右两列除霜间隔时间和除霜时间指令
    ///
    /// 查询左右两列除霜间隔时间和除霜时间指令
    /// \param[in] col 指定列号
    /// \param[in] direction 指定左列还是右列（0x00：左列， 0x01：右列）
    /// \param[out] interval 表示除霜间隔，实际的除霜间隔时间为（interval * 30）分钟
    /// \param[out] duration 表示除霜时间，实际的除霜时间为duration分钟
    /// \return 错误码
    virtual int32_t GetDefrostOption(int32_t col, const unsigned char direction, unsigned char &interval, unsigned char &duration);

    /// \brief 设置除霜模式（加热丝除霜或者风扇除霜）
    ///
    /// 设置除霜模式（加热丝除霜或者风扇除霜）
    /// \param[in] col 指定列号
    /// \param[in] mode 若为0x00，表示设置加热丝除霜模式，若为0x01表示风扇除霜模式
    /// \return 错误码
    virtual int32_t SetDefrostMode(int32_t col, unsigned char mode);

    /// \brief 查询除霜模式（加热丝除霜或者风扇除霜）
    ///
    /// 查询除霜模式（加热丝除霜或者风扇除霜）
    /// \param[in] col 指定列号
    /// \param[out] mode 表示除霜模式，若为0x00，表示加热丝除霜模式，若为0x01表示风扇除霜模式
    /// \return 错误码
    virtual int32_t GetDefrostMode(int32_t col, unsigned char &mode);

    /// \brief 设置停止除霜临界温度指令
    ///
    /// 设置停止除霜临界温度指令
    /// \param[in] col 指定列号
    /// \param[in] temp data0：停止除霜的临界温度
    /// \return 错误码
    virtual int32_t SetDefrostCriticalTemperature(int32_t col, int32_t temp);

    /// \brief 查询门停止除霜的临界温度指令
    ///
    /// 查询门停止除霜的临界温度指令
    /// \param[in] col 指定列号
    /// \param[out] temp data0：停止除霜的临界温度
    /// \return 错误码
    virtual int32_t GetDefrostCriticalTemperature(int32_t col, int32_t &temp);

    /// \brief 设置温区温度上下限值
    ///
    /// 设置温区温度上下限值
    /// \param[in] col 指定列号
    /// \param[in] workarea 表示温区（0x00：表示常温区，0x01：表示冷藏区，0x02：为冷冻区）
    /// \param[in] tl 表示温区的温度下限值（该数据为有符号字节，可为负数）
    /// \param[in] th 表示温区的温度上限值（该数据为有符号字节，可为负数）
    /// \return 错误码
    virtual int32_t SetWorkAreaTemperatureThreshold(int32_t col, unsigned char workarea, int32_t tl, int32_t th);

    /// \brief 查询温区温度上下限值
    ///
    /// 查询温区温度上下限值
    /// \param[in] col 指定列号
    /// \param[in] workarea 表示温区（0x00：表示常温区，0x01：表示冷藏区，0x02：为冷冻区）
    /// \param[in] tl 表示温区的温度下限值（该数据为有符号字节，可为负数）
    /// \param[in] th 表示温区的温度上限值（该数据为有符号字节，可为负数）
    /// \return 错误码
    virtual int32_t GetWorkAreaTemperatureThreshold(int32_t col, unsigned char workarea, int32_t &tl, int32_t &th);

    /// \brief 控制户外照明灯打开或关闭
    ///
    /// 控制户外照明灯打开或关闭
    /// \param[in] col 指定列号
    /// \param[in] cmd 若为0x01，表示打开照明灯，若为0x00表示关闭照明灯
    /// \return 错误码
    virtual int32_t EnableOutdoorLamp(int32_t col, unsigned char cmd);

    /// \brief 设置门框加热丝间隔开启时间和开启时间指令
    ///
    /// 设置门框加热丝间隔开启时间和开启时间指令
    /// \param[in] col 指定列号
    /// \param[in] interval 表示打开启门框加热丝的间隔时间，实际的间隔时间为（interval * 30）分钟
    /// \param[in] duration 表示门框加热丝加热的时间，实际的时间为 duration 分钟
    /// \return 错误码
    virtual int32_t SetDoorFrameHeatingWireOption(int32_t col, unsigned char interval, unsigned char duration);

    /// \brief 查询门框加热丝间隔开启时间和开启时间指令
    ///
    /// 查询门框加热丝间隔开启时间和开启时间指令
    /// \param[in] col 指定列号
    /// \param[out] interval 表示打开启门框加热丝的间隔时间，实际的间隔时间为（interval * 30）分钟
    /// \param[out] duration 表示门框加热丝加热的时间，实际的时间为 duration 分钟
    /// \return 错误码
    virtual int32_t GetDoorFrameHeatingWireOption(int32_t col, unsigned char &interval, unsigned char &duration);

    /// \brief 设置华氏温度显示和摄氏温度显示指令
    ///
    /// 设置华氏温度显示和摄氏温度显示指令
    /// \param[in] col 指定列号
    /// \param[in] data 为0x01表示设置为摄氏温度显示，Data为0x00表示设置为华氏温度显示
    /// \return 错误码
    virtual int32_t SetTemperatureDisplayMode(int32_t col, unsigned char data);

    /// \brief 查询六路温度指令
    ///
    /// 查询六路温度指令
    /// \param[in] col 指定列号
    /// \param[in] temperature 六路温度
    /// \return 错误码
    virtual int32_t GetSixPathTemperature(int32_t col, int32_t *temperature, size_t &len);
};

}  // namespace zlbase
}  // namespace zl

#endif  // ZLBASE_PROTOCOL_ITEMPERATURECONTROLPROTOCOL_H_
